package pe.edu.unmsm.fisi.sisconteg.view.controller;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import pe.edu.unmsm.fisi.sisconteg.business.service.AlumnoService;
import pe.edu.unmsm.fisi.sisconteg.business.service.EgresadoService;
import pe.edu.unmsm.fisi.sisconteg.business.service.GradoTesisService;
import pe.edu.unmsm.fisi.sisconteg.business.service.TesisService;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Alumno;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Egresado;
import pe.edu.unmsm.fisi.sisconteg.domain.model.GradoTesis;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Tesis;

@SuppressWarnings("serial")
@ManagedBean
@Scope("session")
@Controller
public class ConsultaController implements java.io.Serializable {

	private List<Egresado> listResultadosConsulta;
	private Egresado egresadoConsultar;

	private String codigoAlumno;
	private String nombresAlumno;
	private String emailEgresado;
	private String sexoEgresado;
	private String telefonoEgresado;

	private String temaTesis;
	private int tipoTesisTesina;
	private int gradoTesis;

	private String criteriosBusqueda;

	private List<GradoTesis> listGradoTesis;

	@Autowired
	private EgresadoService egresadoService;

	@Autowired
	private AlumnoService alumnoService;

	@Autowired
	private GradoTesisService gradoTesisService;

	@Autowired
	private TesisService tesisService;

	public ConsultaController() {
		egresadoConsultar = new Egresado();
		codigoAlumno = "";
		nombresAlumno = "";
		emailEgresado = "";
		sexoEgresado = "";
		telefonoEgresado = "";

		temaTesis = "";
		tipoTesisTesina = 1;
		gradoTesis = 0;

		criteriosBusqueda = "";
	}

	@PostConstruct
	public void init() {
		listGradoTesis = gradoTesisService.getListGradosTesis();
	}

	public String resultadoConsultaAction() {
		listResultadosConsulta = new ArrayList<Egresado>();
		criteriosBusqueda = "";

		// empieza a consultar todos los campos que no esten vacios
		if (!codigoAlumno.equals("")) {
			listResultadosConsulta.add(egresadoService
					.getEgresadoxCodigoAlumno(codigoAlumno));
			criteriosBusqueda += " codigoAlumno=" + codigoAlumno;
		}

		if (!nombresAlumno.equals("")) {
			List<Alumno> listAlumnos = alumnoService
					.getAlumnosxNombres(nombresAlumno);
			List<Egresado> egresados = new ArrayList<Egresado>();

			for (int i = 0; i < listAlumnos.size(); i++) {
				Alumno alumno = listAlumnos.get(i);
				egresados.add(egresadoService.getEgresadoxCodigoAlumno(alumno
						.getCodigoAlumno()));
			}

			listResultadosConsulta.addAll(egresados);
			criteriosBusqueda += " nombresAlumno=" + nombresAlumno;
		}

		if (!emailEgresado.equals("")) {
			listResultadosConsulta.add(egresadoService
					.getEgresadoxCorreo(emailEgresado));
			criteriosBusqueda += " emailEgresado=" + emailEgresado;
		}

		if (!sexoEgresado.equals("")) {
			listResultadosConsulta.addAll(egresadoService
					.getEgresadosxSexo(sexoEgresado));
			criteriosBusqueda += " sexoEgresado=" + sexoEgresado;
		}

		if (!telefonoEgresado.equals("")) {
			listResultadosConsulta.addAll(egresadoService
					.getEgresadosxTelefono(telefonoEgresado));
			criteriosBusqueda += " telefonoEgresado=" + telefonoEgresado;
		}

		if (!temaTesis.equals("")) {
			List<Tesis> listTesis = tesisService.getTesisxTema(temaTesis);
			Set<Egresado> egresados = new HashSet<Egresado>();

			for (Tesis tesis : listTesis) {
				egresados.add(tesis.getEgresado());
			}
			listResultadosConsulta.addAll(egresados);
			criteriosBusqueda += " temaTesis=" + temaTesis;
		}

		if (tipoTesisTesina != -1) {
			List<Tesis> listTesis = tesisService.getTesisxFlag(tipoTesisTesina);
			Set<Egresado> egresados = new HashSet<Egresado>();

			for (Tesis tesis : listTesis) {
				egresados.add(tesis.getEgresado());
			}
			listResultadosConsulta.addAll(egresados);
			criteriosBusqueda += " tipoTesisTesina="
					+ ((tipoTesisTesina == 0) ? "tesina" : "tesis");
		}

		if (gradoTesis != 0) {
			List<Tesis> listTesis = tesisService.getTesisxGrado(gradoTesis);
			Set<Egresado> egresados = new HashSet<Egresado>();

			for (Tesis tesis : listTesis) {
				egresados.add(tesis.getEgresado());
			}
			listResultadosConsulta.addAll(egresados);
			criteriosBusqueda += " gradoTesis=" + gradoTesis;
		}

		listResultadosConsulta = new ArrayList<Egresado>(new HashSet<Egresado>(
				listResultadosConsulta));
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.put("listResultadosConsulta", listResultadosConsulta);

		limpiarDatos();
		return "pageResultadoConsulta.jsf";
	}

	private void limpiarDatos() {
		egresadoConsultar = new Egresado();
		codigoAlumno = "";
		nombresAlumno = "";
		emailEgresado = "";
		sexoEgresado = "";
		telefonoEgresado = "";

		temaTesis = "";
		tipoTesisTesina = 1;
		gradoTesis = 0;
	}

	public List<Egresado> getListResultadosConsulta() {
		return listResultadosConsulta;
	}

	public void setListResultadosConsulta(List<Egresado> listResultadosConsulta) {
		this.listResultadosConsulta = listResultadosConsulta;
	}

	public Egresado getEgresadoConsultar() {
		return egresadoConsultar;
	}

	public void setEgresadoConsultar(Egresado egresado) {
		this.egresadoConsultar = egresado;
	}

	public String getCodigoAlumno() {
		return codigoAlumno;
	}

	public void setCodigoAlumno(String codigoAlumno) {
		this.codigoAlumno = codigoAlumno;
	}

	public String getNombresAlumno() {
		return nombresAlumno;
	}

	public void setNombresAlumno(String nombresAlumno) {
		this.nombresAlumno = nombresAlumno;
	}

	public String getEmailEgresado() {
		return emailEgresado;
	}

	public void setEmailEgresado(String emailEgresado) {
		this.emailEgresado = emailEgresado;
	}

	public String getSexoEgresado() {
		return sexoEgresado;
	}

	public void setSexoEgresado(String sexoEgresado) {
		this.sexoEgresado = sexoEgresado;
	}

	public String getTelefonoEgresado() {
		return telefonoEgresado;
	}

	public void setTelefonoEgresado(String telefonoEgresado) {
		this.telefonoEgresado = telefonoEgresado;
	}

	public String getCriteriosBusqueda() {
		return criteriosBusqueda;
	}

	public void setCriteriosBusqueda(String criteriosBusqueda) {
		this.criteriosBusqueda = criteriosBusqueda;
	}

	public String getTemaTesis() {
		return temaTesis;
	}

	public void setTemaTesis(String temaTesis) {
		this.temaTesis = temaTesis;
	}

	public int getTipoTesisTesina() {
		return tipoTesisTesina;
	}

	public void setTipoTesisTesina(int tipoTesisTesina) {
		this.tipoTesisTesina = tipoTesisTesina;
	}

	public int getGradoTesis() {
		return gradoTesis;
	}

	public void setGradoTesis(int gradoTesis) {
		this.gradoTesis = gradoTesis;
	}

	public List<GradoTesis> getListGradoTesis() {
		return listGradoTesis;
	}

	public void setListGradoTesis(List<GradoTesis> listGradoTesis) {
		this.listGradoTesis = listGradoTesis;
	}
}
